home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / ami_sys / ovl_src / test1.c < prev    next >
C/C++ Source or Header  |  1993-11-30  |  4KB  |  124 lines

  1. /**/
  2. /* オーバレイライブラリによって呼び出されるプログラム例です          */
  3. /* デジタイズします                                                  */
  4. /* 今のところamiシステムではDTA(Data Transfer Area)を使っていません  */
  5. /* VRAM を通してインタフェースを取ります                             */
  6. /* HIGH C のマニュアルでは                                           */
  7. /* EGB_dezitize() が EGB_digitize() になってから注意                 */
  8. /* どなたか分からなくなったのですがNIFTYのTOWNSフオーラムに書き込んで*/
  9. /* あった方法でデジタイズしています                                  */
  10. /* ハンドル名忘れてしまってスイマセン                                */
  11. /* 御陰で助かりました                                                */
  12. /**/
  13.  
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #include <msdos.cf>
  17. #include <egb.h>
  18. #include <mos.h>
  19. #include <loader.h>              /* pcl_exit() を使うため            */
  20.                                  /* 拡張ライブラリ1 があった方がよい */
  21.  
  22. #define GETVRAM(buf, x1,y1,x2,y2) \
  23.         {    struct {char *bp; short sel; short sx,sy,ex,ey;} p;  \
  24.           p.bp=(char *)buf; p.sel=getds(); \
  25.           p.sx=x1;p.sy=y1;p.ex=x2;p.ey=y2; \
  26.           EGB_writePage(gwork,0);                                  \
  27.           EGB_getBlock( gwork, (char *)&p ); }
  28.  
  29. #define PUTVRAM(buf, x1,y1,x2,y2) \
  30.         {    struct {char *bp; short sel; short sx,sy,ex,ey;} p;  \
  31.           p.bp=(char *)buf; p.sel=getds() ; \
  32.           p.sx=x1;p.sy=y1;p.ex=x2;p.ey=y2; \
  33.           EGB_putBlock( gwork, 0, (char *)&p ); }
  34.  
  35. char  *gwork;            /* EGB用 ワーク領域                 */
  36. char  *mwork;            /* MOS用 ワーク領域                 */
  37. short (*vram)[320] ;    /* VRAMの複写領域                   */
  38.  
  39. void screen_get() 
  40. {
  41.     /* 最初は EGB_init を使わないで画面設定します                  */
  42.     memset( gwork, 0, EgbWorkSize );     /* 念のため0クリア        */
  43.     EGB_displayPage(gwork,0,0);          /* 意味ないかもしれない   */
  44.     EGB_resolution(gwork,0,10);          /* page=0; 32Kmode        */
  45.     EGB_resolution(gwork,1, 3);          /* page=1; 16mode         */
  46.       EGB_writePage( gwork,0); 
  47.     GETVRAM(&vram[0][0],0,0,319,239);    /* VRAMをワーク領域に複写 */
  48. }
  49.  
  50. void screen_set()
  51. {
  52.     EGB_init(gwork,EgbWorkSize);         /* 改めて正式に初期化します */
  53.     EGB_resolution(gwork,0, 9);          /* page=0; 32Kmode          */
  54.     EGB_resolution(gwork,1, 9);          /* page=1; 32Kmode         */
  55.     EGB_writePage(gwork,0);              /* page0 設定               */
  56.     EGB_displayStart(gwork,3,0,0);
  57.     EGB_displayStart(gwork,2,1,1);
  58.     EGB_displayStart(gwork,0,0,0);
  59.     EGB_displayStart(gwork,1,0,0);
  60.     EGB_displayStart(gwork,3,320,240);
  61.     EGB_writePage(gwork,1);              /* page1 設定       */
  62.     EGB_displayStart(gwork,3,0,0);
  63.     EGB_displayStart(gwork,2,1,1);
  64.     EGB_displayStart(gwork,0,0,0);
  65.     EGB_displayStart(gwork,1,0,0);
  66.     EGB_displayStart(gwork,3,320,240);
  67.     EGB_displayPage(gwork,0,3);         /* page1 前 */
  68.     return ;
  69. }
  70.  
  71. void start_dezitize()
  72. {
  73.     static st;
  74.     int b,x,y;
  75.     st=1;                /* 最初はデジタイズON */
  76.     EGB_writePage(gwork, 0 );
  77.     EGB_dezitize( gwork,st ); 
  78.     while( 1 ) {
  79.          MOS_rdpos(&b,&x,&y) ;
  80.          switch( b ) {
  81.                  case 0:  break;
  82.                 case 1: /* マウス左ボタンでデジタイズ */
  83.                     st=((st==0)?1:0);
  84.                     EGB_dezitize( gwork,st ); 
  85.                     do{ MOS_rdpos(&b,&x,&y) ;} while(b==1);
  86.                     break;
  87.                 default: /* 右ボタンでリターン */
  88.                     return;
  89.                 }
  90.     }
  91. }
  92.  
  93. void main(void)
  94. {
  95.     int x,y;
  96.  
  97.     vram=malloc( 240*320* sizeof(short) );
  98.     if(vram==NULL) return ;
  99.     gwork=malloc( EgbWorkSize*sizeof(char) );
  100.     if(gwork==NULL) return ;
  101.     mwork=malloc( MosWorkSize*sizeof(char) );
  102.     if(mwork==NULL) return ;
  103.     
  104.     screen_get();   /* 意味ないが形式的に書いてある */
  105.     screen_set();   /* インタレースモードに設定     */
  106.  
  107.     /* スーパインポーズビット設定 */
  108.     for(y=0; y<120; y++ ) 
  109.       for( x=0; x<320; x++ )
  110.         vram[y][x] |= 0x8000;
  111.     EGB_writePage(gwork, 0);
  112.     EGB_writeMode(gwork, 0);
  113.     PUTVRAM(&vram[0][0],0,0,319,239);
  114.     EGB_writePage(gwork, 1);
  115.     PUTVRAM(&vram[0][0],0,0,319,239);
  116.  
  117.     MOS_start(mwork,MosWorkSize);
  118.     start_dezitize();
  119.     MOS_end();
  120.  
  121.     pcl_exit(0);
  122.     return ;
  123. }
  124.